﻿
namespace Kyoh.Lib.Excel
{
    /// <summary>ページ設定の説明を表します。PageSetup オブジェクトには、すべてのページ設定の属性 (左余白、下余白、用紙サイズなど) が、プロパティとして含まれています。</summary>
	public class PageSetup : Component
	{
        private PageSetup(object obj, Component parent)
            : base(obj, parent)
        {
        }

        /// <summary>Excel COM オブジェクトで、新しいインスタンスを初期化します。</summary>
        /// <param name="obj">Excel COM オブジェクト</param>
        /// <param name="parent">親となる <see cref="Component"/> オブジェクト。</param>
		internal static PageSetup Create(object obj, Component parent)
		{
			return (obj == null) ? null : new PageSetup(obj, parent);
		}

        /// <summary>ヘッダー・フッターをワークシートの余白の端に合わせて配置するかどうかを取得・設定します。</summary>
		public bool AlignMarginsHeaderFooter
		{
			get { return (bool)base.GetProperty("AlignMarginsHeaderFooter"); }
			set { base.SetProperty("AlignMarginsHeaderFooter", value); }
		}

        /// <summary>白黒印刷を行うかどうかを取得・設定します。</summary>
        public bool BlackAndWhite
        {
            get { return (bool)base.GetProperty("BlackAndWhite"); }
            set { base.SetProperty("BlackAndWhite", value); }
        }

        /// <summary>下部余白を取得・設定します。</summary>
        public double BottomMargin
        {
            get { return (double)base.GetProperty("BottomMargin"); }
            set { base.SetProperty("BottomMargin", value); }
        }

        /// <summary>中央フッタを取得・設定します。</summary>
        public string CenterFooter
        {
            get { return (string)base.GetProperty("CenterFooter"); }
            set { base.SetProperty("CenterFooter", value); }
        }

        /// <summary>中央ヘッダを取得・設定します。</summary>
        public string CenterHeader
        {
            get { return (string)base.GetProperty("CenterHeader"); }
            set { base.SetProperty("CenterHeader", value); }
        }

        /// <summary>水平方向にセンタリングするかどうかを取得・設定します。</summary>
        public bool CenterHorizontally
        {
            get { return (bool)base.GetProperty("CenterHorizontally"); }
            set { base.SetProperty("CenterHorizontally", value); }
        }

        /// <summary>垂直方向にセンタリングするかどうかを取得・設定します。</summary>
        public bool CenterVertically
        {
            get { return (bool)base.GetProperty("CenterVertically"); }
            set { base.SetProperty("CenterVertically", value); }
        }

        /// <summary>グラフのサイズを取得・設定します。</summary>
        public PrintSize ChartSize
        {
            get { return (PrintSize)(int)base.GetProperty("ChartSize"); }
            set { base.SetProperty("ChartSize", value); }
        }

        /// <summary>先頭ページに他のページとは異なるヘッダ・フッタにを使用するかどうかを取得・設定します。</summary>
        public bool DifferentFirstPageHeaderFooter
        {
            get { return (bool)base.GetProperty("DifferentFirstPageHeaderFooter"); }
            set { base.SetProperty("DifferentFirstPageHeaderFooter", value); }
        }

        /// <summary>簡易印刷（グラフィックを印刷しない）を行うかどうかを取得・設定します。</summary>
        public bool Draft
        {
            get { return (bool)base.GetProperty("Draft"); }
            set { base.SetProperty("Draft", value); }
        }

        /// <summary>偶数ページの書式を取得します。</summary>
        public Page EvenPage
        {
            get { return Page.Create(base.GetProperty("EvenPage"), this); }
        }

        /// <summary>先頭ページの書式を取得します。</summary>
        public Page FirstPage
        {
            get { return Page.Create(base.GetProperty("FirstPage"), this); }
        }

        /// <summary>先頭ページのページ番号を取得・設定します。</summary>
        public int FirstPageNumber
        {
            get { return (int)base.GetProperty("FirstPageNumber"); }
            set { base.SetProperty("FirstPageNumber", value); }
        }

        /// <summary>ページの高さに対するページ数を取得・設定します。</summary>
        public int? FitToPagesTall
        {
            get
            {
                object baseFitToPagesTall = base.GetProperty("FitToPagesTall");
                if (baseFitToPagesTall is bool)
                    return null;
                return (int)baseFitToPagesTall;
            }
            set
            {
                if (value.HasValue)
                    base.SetProperty("FitToPagesTall", (int)value);
                else
                    base.SetProperty("FitToPagesTall", false);
            }
        }

        /// <summary>ページの幅に対するページ数を取得・設定します。</summary>
        public int? FitToPagesWide
        {
            get
            {
                object baseFitToPagesWide = base.GetProperty("FitToPagesWide");
                if (baseFitToPagesWide is bool)
                    return null;
                return (int)baseFitToPagesWide;
            }
            set
            {
                if (value.HasValue)
                    base.SetProperty("FitToPagesWide", (int)value);
                else
                    base.SetProperty("FitToPagesWide", false);
            }
        }

        /// <summary>ページの拡大・縮小率を取得・設定します。</summary>
        public int? Zoom
        {
            get
            {
                object baseZoom = base.GetProperty("Zoom");
                if(baseZoom is bool)
                    return null;
                return (int)baseZoom;
            }
            set
            {
                if (value.HasValue)
                    base.SetProperty("Zoom", (int)value);
                else
                    base.SetProperty("Zoom", false);
            }
        }

        /// <summary>フッタ余白を取得・設定します。</summary>
        public double FooterMargin
        {
            get { return (double)base.GetProperty("FooterMargin"); }
            set { base.SetProperty("FooterMargin", value); }
        }

        /// <summary>左ヘッダを取得・設定します。</summary>
        public string LeftHeader
        {
            get { return (string)base.GetProperty("LeftHeader"); }
            set { base.SetProperty("LeftHeader", value); }
        }

        /// <summary>奇数ページと偶数ページで異なる書式を使用するかどうかを取得・設定します。</summary>
        public bool OddAndEvenPagesHeaderFooter
        {
            get { return (bool)base.GetProperty("OddAndEvenPagesHeaderFooter"); }
            set { base.SetProperty("OddAndEvenPagesHeaderFooter", value); }
        }

        /// <summary>左余白を取得・設定します。</summary>
        public double LeftMargin
        {
            get { return (double)base.GetProperty("LeftMargin"); }
            set { base.SetProperty("LeftMargin", value); }
        }

        /// <summary>セルの処理順序を取得・設定します。</summary>
        public Order Order
        {
            get { return (Order)(int)base.GetProperty("Order"); }
            set { base.SetProperty("Order", value); }
        }

        /// <summary>印刷方向を取得・設定します。</summary>
        public PageOrientation Orientation
        {
            get { return (PageOrientation)(int)base.GetProperty("Orientation"); }
            set { base.SetProperty("Orientation", value); }
        }

        /// <summary>ページ単位の情報を取得します。</summary>
        public Pages Pages
        {
            get { return Pages.Create(base.GetProperty("Pages"), this); }
        }

        /// <summary>印刷用紙のサイズを取得・設定します。</summary>
        public PaperSize PaperSize
        {
            get { return (PaperSize)(int)base.GetProperty("PaperSize"); }
            set { base.SetProperty("PaperSize", value); }
        }

        /// <summary>印刷範囲を取得・設定します。</summary>
        public string PrintArea
        {
            get { return (string)base.GetProperty("PrintArea"); }
            set { base.SetProperty("PrintArea", value); }
        }

        /// <summary>コメントの印刷方法を取得・設定します。</summary>
        public PrintLocation PrintComments
        {
            get { return (PrintLocation)(int)base.GetProperty("PrintComments"); }
            set { base.SetProperty("PrintComments", value); }
        }

        /// <summary>エラーセルの印刷方法を取得・設定します。</summary>
        public PrintErrors PrintErrors
        {
            get { return (PrintErrors)(int)base.GetProperty("PrintErrors"); }
            set { base.SetProperty("PrintErrors", value); }
        }

        /// <summary>セルの枠線を表示するかどうかを取得・設定します。</summary>
        public bool PrintGridlines
        {
            get { return (bool)base.GetProperty("PrintGridlines"); }
            set { base.SetProperty("PrintGridlines", value); }
        }

        /// <summary>行番号と列番号を印刷するかどうかを取得・設定します。</summary>
        public bool PrintHeadings
        {
            get { return (bool)base.GetProperty("PrintHeadings"); }
            set { base.SetProperty("PrintHeadings", value); }
        }

        /// <summary>セルのメモを印刷するかどうかを取得・設定します。</summary>
        public bool PrintNotes
        {
            get { return (bool)base.GetProperty("PrintNotes"); }
            set { base.SetProperty("PrintNotes", value); }
        }

        /// <summary>タイトル列の範囲を取得・設定します。</summary>
        public string PrintTitleColumns
        {
            get { return (string)base.GetProperty("PrintTitleColumns"); }
            set { base.SetProperty("PrintTitleColumns", value); }
        }

        /// <summary>タイトル行の範囲を取得・設定します。</summary>
        public string PrintTitleRows
        {
            get { return (string)base.GetProperty("PrintTitleRows"); }
            set { base.SetProperty("PrintTitleRows", value); }
        }

        /// <summary>右フッタを取得・設定します。</summary>
        public string RightFooter
        {
            get { return (string)base.GetProperty("RightFooter"); }
            set { base.SetProperty("RightFooter", value); }
        }

        /// <summary>右ヘッダを取得・設定します。</summary>
        public string RightHeader
        {
            get { return (string)base.GetProperty("RightHeader"); }
            set { base.SetProperty("RightHeader", value); }
        }

        /// <summary>右余白を取得・設定します。</summary>
        public double RightMargin
        {
            get { return (double)base.GetProperty("RightMargin"); }
            set { base.SetProperty("RightMargin", value); }
        }

        /// <summary>ヘッダ・フッタをドキュメントに合わせて拡大・縮小するかどうかを取得・設定します。</summary>
        public bool ScaleWithDocHeaderFooter
        {
            get { return (bool)base.GetProperty("ScaleWithDocHeaderFooter"); }
            set { base.SetProperty("ScaleWithDocHeaderFooter", value); }
        }

        /// <summary>丈夫余白を取得・設定します。</summary>
        public double TopMargin
        {
            get { return (double)base.GetProperty("TopMargin"); }
            set { base.SetProperty("TopMargin", value); }
        }

		// dynamic get_PrintQuality(object Index = Type.Missing);
        // void set_PrintQuality(object Index = Type.Missing, object value = Type.Missing);

        /// <summary>中央フッタに表示する画像を取得します。</summary>
        public Graphic CenterFooterPicture { get { return Graphic.Create(base.GetProperty("CenterFooterPicture"), this); } }
        /// <summary>中央ヘッダに表示する画像を取得します。</summary>
        public Graphic CenterHeaderPicture { get { return Graphic.Create(base.GetProperty("CenterHeaderPicture"), this); } }
        /// <summary>左フッタに表示する画像を取得します。</summary>
        public Graphic LeftFooterPicture { get { return Graphic.Create(base.GetProperty("LeftFooterPicture"), this); } }
        /// <summary>左ヘッダに表示する画像を取得します。</summary>
        public Graphic LeftHeaderPicture { get { return Graphic.Create(base.GetProperty("LeftHeaderPicture"), this); } }
        /// <summary>右フッタに表示する画像を取得します。</summary>
        public Graphic RightFooterPicture { get { return Graphic.Create(base.GetProperty("RightFooterPicture"), this); } }
        /// <summary>右ヘッダに表示する画像を取得します。</summary>
        public Graphic RightHeaderPicture { get { return Graphic.Create(base.GetProperty("RightHeaderPicture"), this); } }
	}
}